﻿// Inner Fire 游戏引擎库
// 渲染项目类
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 就是相当于GameObject。用于每个项目
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-11-19

#pragma once

#include <dx/core/frame_resource.h>
#include <dx/core/upload_buffer.h>
#include <dx/mesh/basic_render_item.h>
#include <dx/mesh/dx_mesh.h>
#include <dx/mesh/skin_animator.h>
#include <dx/texture/dx_material.h>
#include <memory>
#include <xml_reader.h>

namespace ifire::dx {

// Lightweight structure stores parameters to draw a shape.  This will
// vary from app-to-app.
class RenderItem : public BasicRenderItem {
public:
  RenderItem() = default;
  RenderItem(const RenderItem& rhs) = delete;

  // 进行一帧的数据更新
  void Update(UploadBuffer<ObjectConstants>* buffer);
  // 设置tiling
  void SetTiling(const DirectX::XMFLOAT2& tiling);
  // 设计世界矩阵
  void SetWorldMatrix(DirectX::FXMMATRIX mat);

public:
  // 指向对应于此渲染项的 Object Buffer 的 GPU 常量缓冲区的索引。
  UINT cb_index = -1;

  // 项目是否生成阴影
  bool cast_shadow = false;
  // 世界矩阵，此为最终变换矩阵，不涉及父级结构父级结构在其它地方演算
  DirectX::XMFLOAT4X4 world = IDENTITY_4X4;
  // 贴图变化矩阵
  DirectX::XMFLOAT4X4 texture_transform = IDENTITY_4X4;

  // 用于GPU渲染
  DirectX::XMFLOAT2 DisplacementMapTexelSize = {1.0f, 1.0f};
  float GridSpatialStep = 1.0f;

  // 此项目的包围盒;
  DirectX::BoundingBox bounding_box;

  // 网格对象
  DxMesh* geo = nullptr;

  // 材质
  Material* material = nullptr;

  // 用于DrawIndexedInstanced的参数.
  UINT index_count = 0;
  UINT index_start = 0;
  int vertex_start = 0;
  int instance_count = 0;

  // 所使用的动画播放器
  dx::SkinAnimator* animator = nullptr;

private:
  // 项目的贴图tiling
  DirectX::XMFLOAT2 tiling_ = DirectX::XMFLOAT2(1.0f, 1.0f);
};

using RenderItemPtr = std::unique_ptr<RenderItem>;

} // namespace ifire::dx